package affichage;


import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.ArrayList;

import javax.swing.JPanel;

import terrain.CaseTerrain;
import terrain.Terrain;


/**
 * Panel qui affichera une petite version du TerrainView (utilisée dans le jeu)
 * @author Alexis BRASY, Geoffrey LEQUESNE, Sandrine PIRIOU, Michel POPOV
 *
 */
public class MiniMap extends JPanel {

    /** Entier nécessaire à la sérialisation */
    private static final long serialVersionUID = 1L;
    /** Le terrain */
    private Terrain terrain;
    /** La liste des cases terrains à afficher */
    private ArrayList<CaseTerrain> afficher; 
	
    /**
     * Constructeur vide de la MiniMap
     */
    public MiniMap() {}
	
    /**
     * Constructeur de la MiniMap
     * @param map
     */
    public MiniMap(TerrainView map) {
        this.setPreferredSize(new Dimension(300, 300));
        this.terrain = map.getTerrain();
        this.afficher = map.getCasesAAfficher();
    }
	
    /**
     * On définit la méthode painComponent
     */
    public void paintComponent(Graphics g) {
        CaseTerrain ct = null;

        super.paintComponent(g);
        
        int k = 0;
		
        for (int i = 0; i < this.terrain.getNbLignes(); i++) {
        	
            for (int j = 0; j < this.terrain.getNbColonnes(); j++) {       		        		
                ct = terrain.getCase(i, j);
                if (i % 2 == 0) {
                    k = 1;
                } else {
                    k = 0;
                }
                drawCaseTerrain(g, ct, k);
            }
        } 
    }

    /**
     * Dessine une case terrain sur la MiniMap
     * @param g
     * @param ct
     * @param i
     */
    public void drawCaseTerrain(Graphics g, CaseTerrain ct, int i) {
        if (afficher.contains(ct)) {
            // On définit l'image à afficher en fonction du TypeTerrain
            switch (ct.getTypeTerrain()) {		
            case PLAINE: 
                g.setColor(new Color(0, 232, 0));
                break;

            case SABLE: 	
                g.setColor(Color.yellow);
                break;		

            case MER:	
                g.setColor(Color.blue);
                break;

            case MONTAGNE: 	
                g.setColor(new Color(140, 40, 0));
                break;

            case FORET: 		 	
                g.setColor(new Color(0, 116, 0));
                break;

            case VIDE:  	
                g.setColor(Color.white);
                break;

            case GLACE:  	
                g.setColor(Color.cyan);
                break;

            default:  	
                g.setColor(Color.black);
                break;
            }

            if (i == 0) {
                g.fillRect(
                        (this.getWidth() / (this.terrain.getNbColonnes() + 1))
                                / 2
                                        + ct.getCoordonnees().getY()
                                                * this.getWidth()
                                                / (this.terrain.getNbColonnes()
                                                        + 1),
                                                        ct.getCoordonnees().getX()
                                                                * this.getHeight()
                                                                / this.terrain.getNbLignes(),
                                                                this.getWidth()
                                                                        / this.terrain.getNbColonnes()
                                                                                - 1,			
                                                                                this.getHeight()
                                                                                        / this.terrain.getNbLignes()
                                                                                                - 1);
                g.setColor(Color.white);
                g.drawRect(
                        (this.getWidth() / (this.terrain.getNbColonnes() + 1))
                                / 2
                                        + ct.getCoordonnees().getY()
                                                * this.getWidth()
                                                / (this.terrain.getNbColonnes()
                                                        + 1),
                                                        ct.getCoordonnees().getX()
                                                                * this.getHeight()
                                                                / this.terrain.getNbLignes(),
                                                                this.getWidth()
                                                                        / this.terrain.getNbColonnes()
                                                                                - 1,			
                                                                                this.getHeight()
                                                                                        / this.terrain.getNbLignes()
                                                                                                - 1);
			
                if (this.terrain.getCase(ct.getCoordonnees().getX(), ct.getCoordonnees().getY()).getUnite()
                        != null) {
				
                    g.setColor(
                            this.terrain.getCase(ct.getCoordonnees().getX(), ct.getCoordonnees().getY()).getUnite().getEquipe().getCouleur());
				
                    g.fillOval(
                            (this.getWidth()
                                    / (this.terrain.getNbColonnes() + 1))
                                            / 2
                                                    + ct.getCoordonnees().getY()
                                                            * this.getWidth()
                                                            / (this.terrain.getNbColonnes()
                                                                    + 1),
                                                                    ct.getCoordonnees().getX()
                                                                            * this.getHeight()
                                                                            / this.terrain.getNbLignes(),
                                                                            this.getWidth()
                                                                                    / this.terrain.getNbColonnes()
                                                                                            - 3,			
                                                                                            this.getHeight()
                                                                                                    / this.terrain.getNbLignes()
                                                                                                            - 3);
				
                    g.setColor(Color.black);
				
                    g.drawOval(
                            (this.getWidth()
                                    / (this.terrain.getNbColonnes() + 1))
                                            / 2
                                                    + ct.getCoordonnees().getY()
                                                            * this.getWidth()
                                                            / (this.terrain.getNbColonnes()
                                                                    + 1),
                                                                    ct.getCoordonnees().getX()
                                                                            * this.getHeight()
                                                                            / this.terrain.getNbLignes(),
                                                                            this.getWidth()
                                                                                    / this.terrain.getNbColonnes()
                                                                                            - 3,			
                                                                                            this.getHeight()
                                                                                                    / this.terrain.getNbLignes()
                                                                                                            - 3);
                }
            } else {
                g.fillRect(
                        ct.getCoordonnees().getY() * this.getWidth()
                        / (this.terrain.getNbColonnes() + 1),
                        ct.getCoordonnees().getX() * this.getHeight()
                        / this.terrain.getNbLignes(),
                        this.getWidth() / this.terrain.getNbColonnes() - 1,			
                        this.getHeight() / this.terrain.getNbLignes() - 1);
                g.setColor(Color.white);
                g.drawRect(
                        ct.getCoordonnees().getY() * this.getWidth()
                        / (this.terrain.getNbColonnes() + 1),
                        ct.getCoordonnees().getX() * this.getHeight()
                        / this.terrain.getNbLignes(),
                        this.getWidth() / this.terrain.getNbColonnes() - 1,			
                        this.getHeight() / this.terrain.getNbLignes() - 1);
			
                if (this.terrain.getCase(ct.getCoordonnees().getX(), ct.getCoordonnees().getY()).getUnite()
                        != null) {
				
                    g.setColor(
                            this.terrain.getCase(ct.getCoordonnees().getX(), ct.getCoordonnees().getY()).getUnite().getEquipe().getCouleur());
				
                    g.fillOval(
                            ct.getCoordonnees().getY() * this.getWidth()
                            / (this.terrain.getNbColonnes() + 1),
                            ct.getCoordonnees().getX() * this.getHeight()
                            / this.terrain.getNbLignes(),
                            this.getWidth() / this.terrain.getNbColonnes() - 3,			
                            this.getHeight() / this.terrain.getNbLignes() - 3);
				
                    g.setColor(Color.black);
				
                    g.drawOval(
                            ct.getCoordonnees().getY() * this.getWidth()
                            / (this.terrain.getNbColonnes() + 1),
                            ct.getCoordonnees().getX() * this.getHeight()
                            / this.terrain.getNbLignes(),
                            this.getWidth() / this.terrain.getNbColonnes() - 3,			
                            this.getHeight() / this.terrain.getNbLignes() - 3);
                }
            }						
	
        } else {
            g.setColor(Color.DARK_GRAY);
			
            if (i == 0) {
                g.fillRect(
                        (this.getWidth() / (this.terrain.getNbColonnes() + 1))
                                / 2
                                        + ct.getCoordonnees().getY()
                                                * this.getWidth()
                                                / (this.terrain.getNbColonnes()
                                                        + 1),
                                                        ct.getCoordonnees().getX()
                                                                * this.getHeight()
                                                                / this.terrain.getNbLignes(),
                                                                this.getWidth()
                                                                        / this.terrain.getNbColonnes()
                                                                                - 1,			
                                                                                this.getHeight()
                                                                                        / this.terrain.getNbLignes()
                                                                                                - 1);
                g.setColor(Color.white);
                g.drawRect(
                        (this.getWidth() / (this.terrain.getNbColonnes() + 1))
                                / 2
                                        + ct.getCoordonnees().getY()
                                                * this.getWidth()
                                                / (this.terrain.getNbColonnes()
                                                        + 1),
                                                        ct.getCoordonnees().getX()
                                                                * this.getHeight()
                                                                / this.terrain.getNbLignes(),
                                                                this.getWidth()
                                                                        / this.terrain.getNbColonnes()
                                                                                - 1,			
                                                                                this.getHeight()
                                                                                        / this.terrain.getNbLignes()
                                                                                                - 1);
            } else {
                g.fillRect(
                        ct.getCoordonnees().getY() * this.getWidth()
                        / (this.terrain.getNbColonnes() + 1),
                        ct.getCoordonnees().getX() * this.getHeight()
                        / this.terrain.getNbLignes(),
                        this.getWidth() / this.terrain.getNbColonnes() - 1,			
                        this.getHeight() / this.terrain.getNbLignes() - 1);
                g.setColor(Color.white);
                g.drawRect(
                        ct.getCoordonnees().getY() * this.getWidth()
                        / (this.terrain.getNbColonnes() + 1),
                        ct.getCoordonnees().getX() * this.getHeight()
                        / this.terrain.getNbLignes(),
                        this.getWidth() / this.terrain.getNbColonnes() - 1,			
                        this.getHeight() / this.terrain.getNbLignes() - 1);				
            }
        }
		
    }	

}
